#include <utility>
#include <set>
#include <algorithm>
using namespace std;
class MyCalendar
{
private:
    struct node
    {
        // 只需要重载一个比较函数 看你模板给的greater还是less
        // 关于去重:
        // stl里用的等价比较在插入时会先判断是否相等: 在插入b节点经过a节点时,模板是greater则会调用 !(a>b)&&!(b>a) ,总体为真则代表a与b相等不插入,如果不为真在决定是插入a的左边还是右边(红黑树是二叉搜索树) ;
        bool operator>(const node &node) const
        {
            return start >= node.end;
        }
        int start;
        int end;
    };
    set<node, greater<node>> rbTree;

public:
    MyCalendar()
    {
    }

    bool book(int start, int end)
    {
        return rbTree.insert({start, end}).second;
    }
};

/**
 * Your MyCalendar object will be instantiated and called as such:
 * MyCalendar* obj = new MyCalendar();
 * bool param_1 = obj->book(start,end);
 */